Nazwa  : Protocol
Wersja : 1.0
Opis   : Protok sieciowy gry Game Master 2
Autor  : Adam Sawicki "Regedit"
Data   : 2004-08-19
URL    : mailto:regedit@risp.pl
URL    : http://www.programex.prv.pl/


Wstp
=====

Dokument opisuje budow protokou sieciowego uywanego przez gr
Game Master 2. Przed czytaniem zalecabym zapoznanie si z informacjami
w pliku "TechNote.txt".

Domylny port     : 7779 (mona te stosowa inne)
Program uywajcy : Game Master 2
Rodzaj            : gniazda TCP

Host tworzy serwer i jednoczenie klienta, ktry si do niego podcza
lokalnie przez loopback. Inni klienci, z tego samego komputera, z sieci
lokalnej lub z Internetu, take mog si do serwera pocza. Mwimy, e
ten pierwszy _stworzy gr_, a pozostali _doczyli do gry_.

Kady klient jest w danej chwili w jednym ze stanw:

- {RESOLVING}  : jeli aktualnie poszukuje IP na podstawie adresu serwera
- {CONNECTING} : jeli aktualnie prbuje nawiza poczenie z serwerem
- {AUTH}       : jeli aktualnie prbuje uwierzytelni si na serwerze
- {DOWNLOAD}   : jeli aktualnie pobiera dane gry od serwera
- {DONE}       : jeli aktualnie normalnie uczestniczy w grze
- {OPEN}       : jeli aktualnie trwa otwieranie gry


Przebieg gry
============

1. {RESOLVING}
   Klient poszukuje adresu IP serwera na podstawie podanej nazwy hosta

2. {CONNECTING}
   Klient prbuje nawiza poczenie z serwerem

3. {AUTH}
   - Klient wysya prob o uwierzytelnienie AUTH
   - Jeli si uda : serwer odsya mu OK
     Jeli si nie uda : serwer odsya mu ERROR

3. {DOWNLOAD}
   - Serwer wysya klientowi dane gry - w dowolnej iloci i kolejnoci
     pakiety typu: PLAYER_ADD, LIST_LOCK, CHARCARD_LOCK, SESSION_LOCK,
     SESSION_UPDATE
   - Serwer wysya na zakoczenie OK
   - Klient odsya potwierdzenie zakoczenie odbierania: OK

4. {DONE}
   W tym stanie trwa normalna gra. Serwer i klient wymieniaj pakiety
   rnego rodzaju.

Jeli klient, ktry jest MG wyle do serwera pakiet OPEN, rozpoczyna si
otwieranie gry {OPEN}.

1. Klient MG wysya do serwera w dowolnej iloci i kolejnoci pakiety typu:
   OPEN_CHARCARD, SESSION_UPDATE

   Serwer rozsya te dane do klientw w postaci pakietw typu:
   SESSIO_UPDATE, PLAYER_ADD, PLAYER_UPDATE_CHARCARDOK

3. Klient MG wysya do serwera pakiet koca otwierania OPEN_END

   Serwer rozsya do klientw OK

4. Klienci odsyaj do serwera OK


Pakiety
=======

Jakkolwiek protok opiera si na metodzie TCP, ktra jest strumieniowa,
definiuje on wasny podzia przesyanych danych na pakiety. Kady pakiet
ma posta:

1. Dugo pakietu [4u]
   To ilo bajtw danych pakietu nie wliczajc w to samej tej wartoci.
2. Dane pakietu

Dane pakietu maj z kolei budow:

1. Typ pakietu [1u]
2. Pozostae dane, zalenie od typu

Oto opis poszczeglnych typw pakietw:

AUTH (1)
~~~~~~~~
Proba o autoryzacj
* Klient do serwera, jeden raz, na pocztku, podczas autoryzacji {AUTH}

- [4s] Nick
- [4s] Nazwa
- [4s(xor 'X')] Haso
  Haso jest zaszyfrowane w ten sposb, e kady bajt (znak) acucha jest
  poddany operacji bitowej rnicy symetrycznej XOR przez kod znaku 'X'.
- [4u] Wersja

OK (2)
~~~~~~
Potwierdzenie czego
* W rnych sytuacjach - patrz "Przebieg gry"

- (Pusty)

ERROR (3)
~~~~~~~~~
Jaki bd
* Klient do serwera, w dowolnym momencie

- [4s] Komunkat (moe by acuch pusty)

Klient po odebraniu tego pakietu powinien pokaza przekazany komunikat i
natychmiast si rozczy.

PLAYER_ADD (4)
~~~~~~~~~~~~~~
Dodanie gracza do listy
* Serwer do klienta

- [4u(enum)] Stan
  {DOWNLOAD} : 1
  {DONE}     : 2
  {OPEN}     : 3
- [4s] Ksywa
- [4s] Nazwa postaci
- [1b] Czy host
- [1b] Czy mistrz gry (MG)
- [4f] Lag (w sekundach)
- [4s] Karta postaci
- [4i] ID
- [1b] Czy obecny

PLAYER_DEL (5)
~~~~~~~~~~~~~~
Usunicie gracza z listy
* Serwer do klienta

- [4i] ID
- [4s] Powd (moe by pusty)

PLAYER_UPDATE_STATE (6)
~~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie stanu gracza
* Serwer do klienta

- [4i] ID
- [4u(enum)] Stan
  Patrz "PLAYER_ADD"

PLAYER_UPDATE_NICK (7)
~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie ksywy gracza
* Serwer do klienta

- [4i] ID
- [4s] Nowa ksywa

PLAYER_UPDATE_NAME (8)
~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie nazwy postaci gracza
* Serwer do klienta

- [4i] ID
- [4s] Nowa nazwa postaci

PLAYER_UPDATE_MASTER (9)
~~~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie informacji o stanie mistrza gry (MG) gracza
* Serwer do klienta

- [4i] ID
- [1b] Czy teraz jest mistrzem

PLAYER_UPDATE_LAG (10)
~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie laga gracza
* Serwer do klienta

- [4i] ID
- [4f] Nowy lag (w sekundach)

PLAYER_UPDATE_CHARCARD (11)
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie karty postaci gracza
* Serwer do klienta

- [4i] ID
- [4s] Nowa karta postaci

PLAYER_UPDATE_OBECNY (12)
~~~~~~~~~~~~~~~~~~~~~~~~~
Uaktualnienie stanu obecnoci gracza
* Serwer do klienta

- [4i] ID
- [4b] Czy obecny
- [4s] Powd ewentualnego wyjcia, jeli zmienia si z obecnego
  na nieobecny (moe by pusty)

PLAYER_ADDR (13)
~~~~~~~~~~~~~~~~
Adres gracza
* Serwer do klienta, po doczeniu nowego gracza do gry i resolvniciu
  jego adresu

- [4i] ID
- [in_addr] IP
- [4s] Nazwa (moe by pusta)

CHANGE_NICK (14)
~~~~~~~~~~~~~~~~
Proba o zmian ksywy
* Klient do serwera

- [4s] Nowa ksywa

CHANGE_NAME (15)
~~~~~~~~~~~~~~~~
Proba o zmian nazwy postaci
* Klient do serwera

- [4s] Nowa nazwa postaci

MSG (16)
~~~~~~~~
Jaki komunikat tekstowy
* Serwer do klienta

- [4s] Tre

SAY (17)
~~~~~~~~
Powiedzenie czego na konsoli
* Klient do serwera

- [1b] Czy "me"
  prawda : uy polecenia "/me"
  fasz  : powiedzia normalnie
- [4s] Tekst

TOLD (18)
~~~~~~~~~
Kto co powiedzia na konsoli
* Serwer do klienta

- [4i] ID
- [1b] Czy "me"
- [4s] Tekst

PING (19)
~~~~~~~~~
Sprawdzenie poczenia i pomiar lagw
* Serwer do klienta
* Klient do serwera w odpowiedzi

- (Pusty)

MASTER (20)
~~~~~~~~~~~
Proba o przekazanie stanowiska MG
* Klient do serwera, musi by MG

- [4i] ID tego, komu chce przekaza

KICK (21)
~~~~~~~~~
Proba o wyproszenie
* Klient do serwera, musi by MG

- [4i] ID tego, kogo chce wyprosi (nie mona hosta, mona siebie)

LIST_LOCK (22)
~~~~~~~~~~~~~~
* Klient do serwera, musi by MG - proba o zablokowanie listy graczy
* Serwer do klienta - informacja o zablokowaniu listy graczy

- [1b] Czy lista zablokowana

CHARCARD_LOCK (23)
~~~~~~~~~~~~~~~~~~
* Klient do serwera, musi by MG - proba o zablokowanie kart postaci
* Serwer do klienta - informacja o zablokowaniu kart postaci

- [1b] Czy karty postaci zablokowane

SESSION_LOCK (24)
~~~~~~~~~~~~~~~~~
* Klient do serwera, musi by MG - proba o zablokowanie sesji
* Serwer do klienta - informacja o zablokowaniu sesji

- [1b] Czy sesja zablokowana

SESSION_SEND (25)
~~~~~~~~~~~~~~~~~
Wysanie nowego tekstu do sesji
* Klient do serwera - kiedy chce co wysa (musi by MG lub sesja nie jest
  zablokowana)
* Serwer do klienta rozsya wszystkim

- [4s] Tre

Przy spenionym zaoeniu o przechowywaniu w kadej chwili przez serwer i
wszystkich klientw tego samego stanu sesji i tej samej wartoci staej
limitu strony (32 kB), kady tak serwer jak i klient moe stron docelow
wydedukowa sam.

SESSION_UPDATE (26)
~~~~~~~~~~~~~~~~~~~
Nowa, zmodyfikowana wersja danej strony sesji
* Klient do serwera {DONE} - kiedy chce zaktualizowa zmiany (musi by MG)
* Serwer do klienta {DOWNLOAD}, {DONE} - rozsya wszystkim

- [4i] Indeks strony
- [4s] Tre

CLEAR (27)
~~~~~~~~~~
Czyci ca gr (polecenie "Nowa gra")
* Klient do serwera - danie wyczyszczenia gry (musi by MG)
* Serwer do klienta - wyczyszczenie gry

- (Pusty)

OPEN (28)
~~~~~~~~~
Czyci gr i powoduje przejcie do stanu otwierania gry {OPEN} (polecenie
"Otwrz gr")
* Klient do serwera - danie rozpoczcia otwierania (musi by MG)
* Serwer do klienta - rozpoczcie otwierania

- (Pusty)

OPEN_CHARCARD (29)
~~~~~~~~~~~~~~~~~~
Wczytanie karty postaci w ramach otwierania gry
* Klient do serwera, {OPEN}, serwer w reakcji rozsya ju waciwe
  modyfikacje listy graczy

- [4s] Ksywa
- [4s] Nazwa postaci
- [4s] Karta postaci

OPEN_END (30)
~~~~~~~~~~~~~
Zakoczenie otwierania gry
* Klient do serwera, {OPEN}

- (Pusty)
